6336
12367
想要改善這篇文章嗎?提供此問題的詳細答案,包括引文和為什麼答案正確的解釋。答案不夠詳細的答案可能會被編輯或刪除。
我錯誤地使用以下命令將文件添加到了Git:
git添加myfile.txt
我還沒有運行git commit。有一種方法可以撤消此操作,以便這些文件不會包含在提交中? 
1個
2
下一個
您可以在提交之前撤消git add
git reset <文件>
這會將其從當前索引(“即將提交”列表)中刪除,而無需進行其他任何更改。
您可以使用
git重置
沒有任何文件名可以取消所有應有的更改。當在合理的時間內有太多文件不能一一列出時,這可能會派上用場。
在舊版本的Git中,上述命令分別等效於git reset HEAD 和git reset HEAD,如果HEAD未定義(因為尚未在存儲庫中進行任何提交)或模棱兩可(因為創建了一個名為HEAD的分支,這是愚蠢的事情,您不應該這樣做)。不過,在Git 1.8.2中已對此進行了更改,因此在現代版本的Git中,甚至可以在進行首次提交之前使用上述命令:
“ git reset”(無選項或參數)用於在以下情況下出錯
您的歷史記錄中沒有任何提交,但是現在可以給您
空索引(為了匹配不存在的提交,您甚至都沒有參與)。
文檔:git reset
|
你要:
git rm --cached <添加文件到_撤消>
推理:
當我是新手時,我首先嘗試
git reset。
(撤消我的整個初始添加),只是得到了此消息(不是這樣),有幫助:
致命的:無法將“ HEAD”解析為有效的參考。
事實證明,這是因為HEAD ref(分支?)在第一次提交之後才存在。也就是說,如果您的工作流程(例如我的工作流程)類似於:
cd到我偉大的新項目目錄中,嘗試Git,新熱點
git初始化
git添加
git狀態
...很多廢話
=>該死,我不想添加所有內容。
谷歌“撤消git添加”
=>查找堆棧溢出-是
git reset。
=>致命:無法將“ HEAD”解析為有效的引用。
事實證明,在郵件列表中有一個針對此問題的日誌記錄了一個錯誤。
而且正確的解決方案就在Git狀態輸出中(是的,我掩飾為“廢話”)
...
#要提交的更改:
#(使用“ git rm --cached <文件> ...”取消登台)
...
解決方案的確是使用git rm --cached FILE。
注意此處其他地方的警告-git rm刪除文件的本地工作副本,但如果使用--cached則不會刪除。這是git help rm的結果:
-緩存
使用此選項可以取消登台並僅從索引中刪除路徑。
無論是否修改,都會保留工作樹文件。
我繼續使用
git rm-緩存
刪除所有內容,然後重新開始。不過沒有用,因為在添加時。是遞歸的,結果表明rm需要-r來遞歸。嘆。
git rm -r --cached。
好的,現在我回到了起點。下次,我將使用-n進行空運行並查看將添加的內容:
git add -n
在信任git help rm關於--cached不會破壞任何內容(以及我拼錯的內容該怎麼辦)之前,我將所有內容壓縮到一個安全的地方。
|
如果輸入:
git狀態
Git會告訴您已登台的內容等,包括有關如何登台的說明:
使用“ git reset HEAD <文件> ...”取消登台
我發現Git在這種情況下勉強讓我做正確的事情做得很好。
注意:最新的Git版本(1.8.4.x)更改了此消息:
(使用“ git rm --cached <文件> ...”取消登台)
|
需要說明的是:git add將更改從當前工作目錄移動到暫存區(索引)。
此過程稱為暫存。因此,進行更改(更改文件)的最自然的命令是顯而易見的命令:
git階段
git add只是git stage易於使用的別名
可惜沒有git unstage或git unadd命令。相關的難以猜測或記住,但很明顯:
git reset HEAD-
我們可以輕鬆為此創建一個別名:
git config --global alias.unadd'重置頭-'
git config --global alias.unstage'重置頭-'
最後,我們有了新命令:
git添加文件1
git stage file2
git unadd file2
git unstage file1
我個人使用更短的別名:
git a#用於暫存
git u#用於暫存
|
除了已接受的答案之外,如果錯誤添加的文件很大,您可能會注意到,即使使用'git reset'將其從索引中刪除後,它似乎仍然佔據.git目錄中的空間。
這沒什麼好擔心的。該文件確實仍在存儲庫中,但僅作為“鬆散對象”。不會將其複製到其他存儲庫(通過克隆,推送),最終將回收該空間-儘管可能不會很快。如果您著急,可以運行:
git gc --prune =現在
更新(以下是我嘗試清除最受好評的答案可能引起的一些混淆):
那麼,哪個是git add的真正撤消?
git reset HEAD <文件>
要么
git rm --cached <文件>?
嚴格來說,如果我沒有記錯的話:沒有。
git add無法撤消-通常來說是安全的。
讓我們首先回顧一下git add 的實際作用:
如果以前未跟踪,則git add將其添加到緩存及其當前內容。
如果已經跟踪了,則git add將當前內容(快照,版本)保存到緩存中。在Git中,此操作仍稱為添加(而不只是更新),因為文件的兩個不同版本(快照)被視為兩個不同的項目:因此,我們的確是向緩存中添加了一個新項目,最終以後提交。
鑑於此,這個問題有點模棱兩可:
我錯誤地使用命令添加了文件...
OP的情況似乎是第一個(未跟踪的文件),我們希望“撤消”從跟踪的項目中刪除文件(而不僅僅是當前內容)。如果是這種情況,則可以運行git rm --cached 。
我們還可以運行git reset HEAD 。通常,這是可取的,因為它在兩種情況下都有效:當我們錯誤地添加已經跟踪的項目的版本時,它也會撤消操作。
但是有兩個警告。
第一:(在答案中指出)只有一種情況,其中git reset HEAD不起作用,但是git rm --cached起作用:新的存儲庫(無提交)。但是,實際上,這實際上是無關緊要的情況。
其次:請注意git reset HEAD不能神奇地恢復以前緩存的文件內容,它只是與HEAD重新同步。如果我們誤導的git add覆蓋了先前暫存的未提交版本,我們將無法恢復它。因此,嚴格來說,這是我們不能撤消[*]的原因。
例:
$ git init
$ echo“版本1”> file.txt
$ git add file.txt#第一次添加file.txt
$ git commit -m'第一次提交'
$ echo“版本2”> file.txt
$ git add file.txt#階段(不要提交)file.txt的“版本2”
$ git diff --cached file.txt
版本1
+版本2
$ echo“版本3”> file.txt
$ git diff file.txt
版本2
+版本3
$ git add file.txt#糟糕,我們不是這個意思
$ git reset HEAD file.txt#撤消嗎?
$ git diff --cached file.txt#當然沒有dif。階段== HEAD
$ git diff file.txt#我們不可挽回地丟失了“版本2”
版本1
+版本3
當然,如果僅遵循通常的懶惰工作流(僅用於添加新文件)進行“ git add”(案例1),然後通過commit git commit -a命令更新新內容,這並不是很關鍵。
*(編輯:以上內容實際上是正確的,但是仍然可能有一些稍作修改/令人費解的方法來恢復已上演但未提交但隨後被覆蓋的更改-請參閱Johannes Matokic和iolsmit的評論)
|
使用Git撤消已經添加的文件非常容易。要重置已添加的myfile.txt,請使用:
git reset HEAD myfile.txt
說明:
暫存不需要的文件後,要撤消,可以執行git reset。 Head是本地文件的頭,最後一個參數是文件名。
我已為您在下圖中創建了更詳細的步驟,包括在這些情況下可能發生的所有步驟:
|
git rm-緩存-r
將遞歸“取消添加”從當前目錄添加的所有內容
|
跑
git gui
並手動刪除所有文件,或選擇所有文件並單擊“從提交取消登台”按鈕。
|
這個問題沒有明確提出。原因是git add具有兩個含義:
在登台區域添加一個新文件,然後使用git rm --cached文件撤消。
將一個已修改的文件添加到暫存區域,然後使用git reset HEAD文件撤消。
如有疑問,請使用
git reset HEAD文件
因為在兩種情況下都可以完成預期的操作。
警告:如果對修改過的文件(倉庫中以前存在的文件)執行git rm --cached文件,則在git commit時將刪除該文件!它仍然存在於您的文件系統中,但是如果其他人拉您的提交,該文件將從他們的工作樹中刪除。
git status會告訴您該文件是新文件還是已修改的文件:
在分支機構主管
所做更改:
(使用“ git reset HEAD <文件> ...”取消登台)
新文件:my_new_file.txt
已修改:my_modified_file.txt
|
Git擁有可以想像的每一個動作的命令,但是它需要廣泛的知識來使事情變得正確,因此它充其量是違反直覺的……
您之前做了什麼:
更改了文件,並使用git add。或git add <文件>。
你想要什麼:
從索引中刪除文件,但保持版本化,並保留工作副本中未提交的更改:
git reset HEAD <文件>
將文件重置為HEAD的最後一個狀態,撤消更改並將其從索引中刪除:
#認為`svn revert `IIRC。
git reset HEAD <文件>
git checkout <文件>
#如果您有一個名為的``,請使用:
git checkout-<文件>
這是必需的,因為git reset --hard HEAD不適用於單個文件。
從索引和版本控制中刪除,保留未版本化的文件以及工作副本中的更改:
git rm-緩存<文件>
從工作副本和版本中完全刪除:
git rm <文件>
|
如果您正在進行初次提交,則不能使用git重置,只需聲明“ Git破產”並刪除.git文件夾並重新開始
|
根據許多其他答案,您可以使用git reset
但:
我發現了這篇很棒的小文章,實際上為git unadd添加了Git命令(還有一個別名):有關詳細信息,請參見git unadd。
只是,
git config --global alias.unadd“重置頭”
現在你可以
git unadd foo.txt bar.txt
|
使用git add -i從您即將提交的提交中刪除剛添加的文件。例:
添加您不需要的文件:
$ git add foo
$ git狀態
#在分支主管上
#要提交的更改:
#(使用“ git reset HEAD <文件> ...”取消登台)
#
#新文件:foo
#
#未跟踪的文件:
#(使用“ git add <文件> ...”包含在將提交的內容中)
#[...]#
進入交互式添加以撤消添加(在git此處鍵入的命令是“ r”(還原),“ 1”(列表還原中的第一項顯示),“返回”以退出還原模式和“ q” (放棄):
$ git add -i
分階段未分階段的路徑
1:+ 1 / -0沒什麼foo
***命令***
1:[狀態] 2:[正常] 3:[逆轉] 4:[a] dd未跟踪
5:[p]補6:[d] iff 7:[q] uit 8:[h] elp
現在怎麼辦
分階段未分階段的路徑
1:+ 1 / -0無[f] oo
還原>> 1
分階段未分階段的路徑
* 1:+ 1 / -0無[f] oo
還原>>
注意:foo現在未被跟踪。
恢復一條路
***命令***
1:[狀態] 2:[正常] 3:[逆轉] 4:[a] dd未跟踪
5:[p]補6:[d] iff 7:[q] uit 8:[h] elp
現在怎麼辦
再見
$
而已!這是您的證明,表明“ foo”又回到了未跟踪列表中:
$ git狀態
#在分支主管上
#未跟踪的文件:
#(使用“ git add <文件> ...”包含在將提交的內容中)
#[...]
#foo
沒有添加任何內容提交但存在未跟踪的文件(使用“ git add”進行跟踪)
$
|
可以使用git remove或git rm,帶有--cached標誌。嘗試:
git help rm
|
當您開始一個新項目時,這是一種避免此煩惱的方法:
為新項目創建主目錄。
運行git init。
現在創建一個.gitignore文件(即使它是空的)。
提交您的.gitignore文件。
如果您沒有任何提交,Git會使執行git reset變得非常困難。如果您只是為了擁有一個而創建一個微小的初始提交,那麼您可以根據需要進行git add -A和git reset多次,以使所有操作正確。
此方法的另一個優點是,如果以後遇到行尾麻煩並且需要刷新所有文件,則很容易:
簽出該初始提交。這將刪除您的所有文件。
然後再次檢查您最近的提交。這將使用您當前的行尾設置來檢索文件的新副本。
|
自您發布問題以來,也許Git已經發展。
$> git --version
git版本1.6.2.1
現在,您可以嘗試:
git reset HEAD。
這應該是您想要的。
|
請注意,如果您未能指定修訂版本,則必須包含分隔符。我的控制台示例:
git reset <文件路徑>
致命:參數“ ”不明確:修訂版本未知或不在工作樹中的路徑。
使用“-”將路徑與修訂分開
git reset-<文件路徑>
重置後的未分級更改:
M <文件路徑>
(Git版本1.7.5.4)
|
如上所述,要從登台區域刪除新文件(並且僅在新文件的情況下):
git rm-緩存的文件
rm --cached僅用於意外添加的新文件。
|
要重置特定文件夾(及其子文件夾)中的每個文件,可以使用以下命令:
git reset *
|
使用*命令一次處理多個文件:
git reset HEAD * .prj
git reset HEAD * .bmp
git reset HEAD * gdb *
等等
|
只需輸入git reset,它就會還原,就像您從未輸入git add一樣。自上次提交以來。確保您之前已作出承諾。
|
假設我創建一個新文件newFile.txt:
假設我不小心添加了文件,git add newFile.txt:
現在我想撤消此添加,在提交之前,git reset newFile.txt:
|
對於特定文件:
git reset my_file.txt
git checkout my_file.txt
對於所有添加的文件:
git reset。
git checkout。
注意:檢出會更改文件中的代碼,並移至上次更新(提交)狀態。重置不會更改代碼;它只是重置標題。
|
要撤消git add,請使用:
git reset文件名
|
此命令將取消存儲您的更改:
git reset HEAD filename.txt文件
您也可以使用
git添加-p
添加文件的一部分。
|
還有交互模式:
git添加-i
選擇選項3取消添加文件。就我而言,我經常想添加多個文件,並且在交互模式下,您可以使用像這樣的數字來添加文件。除了4:1、2、3和5外,這將佔用所有其他內容
要選擇一個序列,只需輸入1-5即可將1取為5。
Git暫存文件
|
git add myfile.txt#這會將您的文件添加到待提交列表中
與該命令完全相反的是,
git reset HEAD myfile.txt#這將撤消它。
因此,您將處於以前的狀態。指定將再次出現在未跟踪列表中(以前的狀態)。
它將使用該指定文件重置您的頭部。因此,如果您的頭部沒有此功能,它將簡單地將其重置。
|
git reset filename.txt
將從當前索引的“即將提交”區域中刪除一個名為filename.txt的文件,而不進行任何其他更改。
|
git reset filename.txt
將從當前索引的“即將提交”區域中刪除一個名為filename.txt的文件,而不進行任何其他更改。
|
在Sourcetree中,您可以通過GUI輕鬆完成此操作。
您可以檢查Sourcetree用於取消暫存文件的命令。
我創建了一個新文件並將其添加到Git。然後,我使用Sourcetree GUI取消登台。
結果如下:
正在取消暫存文件[15/12/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q-路徑/到/文件/文件名.java
Sourcetree使用reset取消登台新文件。
|
1個
2
下一個
高度活躍的問題。贏得10個聲譽才能回答這個問題。信譽要求有助於保護該問題免受垃圾郵件和非答復活動的侵害。
不是您要找的答案?瀏覽其他標記為git version-control git-commit git-stage的問題,或詢問您自己的問題。